package com.example.java_chatroom.api;

import com.example.java_chatroom.model.User;
import com.example.java_chatroom.model.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.session.StandardSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Slf4j
@RestController
@Controller
@ResponseBody
public class UserAPI {
    @Resource
    private UserMapper userMapper;

    /**
     * 用户登录
     * 返回 User 对象
     * 登录成功, 返回的 User 对象包含用户信息, 并且将 User 对象存储在 session 中
     * 登录失败, 返回的 User 对象无内容
     */
    @RequestMapping("/login")
    public Object login(String username, String password, HttpServletRequest request) {
        // 判空
        if(!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {
            return new User();
        }

        // 校验用户名密码
        User user = userMapper.selectByName(username);
        if(user == null || !password.equals(user.getPassword())) {

            return new User();
        }

        // 校验成功, 则登陆成功, 创建会话
        // true 表示会话不存在则创建会话, false 表示会话不存在就返回空
        HttpSession session = request.getSession(true);
        session.setAttribute("user",user);
        user.setPassword("");
        return user;
    }

    /**
     * 用户注册
     * 返回 User 对象
     * 注册成功, 返回的 User 对象包含用户信息
     * 注册失败, 返回的 User 对象无内容
     */
    @RequestMapping("/register")
    public Object register(String username, String password) {
        User user = new User();
        // 判空
        if(!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {
            return user;
        }

        try {
            user = new User(username, password);
            int ret = userMapper.insert(user);
            log.info("注册 ret :{}", ret);
            user.setPassword("");
        } catch (DuplicateKeyException e) {
            // 抛出该异常说明用户名重复, 注册失败
            user = new User();
            log.error("用户名重复, 注册失败");
        }

        return user;
    }

    /**
     * 获取登录用户的信息
     * 从 session 中获取 user 数据
     * @return 当前登录用户的信息
     */
    @RequestMapping("/userInfo")
    public Object getUserInfo(HttpServletRequest req) {
        // 1.先从请求中获取到会话
        HttpSession session = req.getSession(false);
        if(session == null) {
            log.info("[getUserInfo] 获取不到 session 对象!");
            return new User();
        }
        // 2. 从会话中获取到之前保存的用户对象
        User user = (User) session.getAttribute("user");
        if(user == null) {
            log.info("[getUserInfo] 获取不到 user 对象!");
            return new User();
        }
        user.setPassword("");
        return user;
    }
}
